package QianFeng09.ThreadDemo;

import java.util.concurrent.*;

/**JDK1.5后
 * 线程池：预先创建线程的一种技术
 * Java里面线程池的顶级接口是Executor，是一个执行线程的工具。
 * 线程池接口是ExecutorService。
 *
 * java.util.concurrent包:并发编程中很常用的实用工具类
 * Executor接口:
 *      执行已提交的Runnable任务的对象。1
 * ExecutorService接口:
 *      Executor 提供了管理终止的方法，以及可为跟踪一个或多个 异步任务执行状况而生成Future的方法。
 * Executors类:
 *      此包中所定义的Executor、ExecutorService等的工厂和实用方法。
 *
 * 在Executors类里面腿供了一些静态工厂，生成一些常用的线程池。
 * newSingleThreadExecutor:
 *      创建一个单线程的线程池。这个线程池只有一个线程在工作，也就是相当于单线程串行执
 *      行所有任务。如果这个唯一的线程因为异常结束，那么会有一个新的线程来替代它。
 *      此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
 * newFixedThreadPool:
 *      创建固定大小的线程池。每次提交一个任务就创建一个线程，直到线程达到线程池的最大大小。
 *      线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束，那么线程池会补充一个新线程。
 * newCachedThreadPool:
 *      创建一个可缓存的线程池。
 *      如果线程池的大小超过了处理任务所需要的线程，那么就会回收部分空闲(60秒不执行任务)的线程，
 *      当任务数增加时，此线程池又可以智能的添加新线程来处理任务。
 *      此线程池不会对线程池大小做限制，线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
 * newScheduledThreadPool:
 *      创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
 **/
public class ThreadPool {
    public static void main(String[] args) {
        /*创建线程池（四种）*/
        //1、创建一个单线程的线程池
        ExecutorService es1= Executors.newSingleThreadExecutor();
        //2、创建一个固定大小的线程池
        ExecutorService es2 = Executors.newFixedThreadPool(2);//创建两个线程
        //3、创建一个可缓存的线程池
        ExecutorService es3 = Executors.newCachedThreadPool();
        //4、创建一个大小无限的线程池
        ScheduledExecutorService es4 = Executors.newScheduledThreadPool(3);
        es4.execute(new MyRunnable6());
        es4.execute(new MyRunnable6());
        es4.schedule(new MyRunnable6(), 3000, TimeUnit.MILLISECONDS);
        es4.shutdown();//线程结束
    }
}

class MyRunnable6 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "----" + i);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
